﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using CapturarObjetos.Objetos;
using CapturarObjetos.Nucleo;


namespace CapturarObjetos.Cenas
{
    public class Cena_Game_04
    {

        GraphicsDevice graphics;
        
        float pontos;
        Luz luz;

        /// <summary>
        /// Gerador de números aleatórios
        /// </summary>
        Random random = new Random();

        

        Camera camera;
        Camera cameraMapa;

        public Song musica;

        ObjetoJogo chao;

        Jogador jogador;
        BoostVelocidade energia;
        Texture2D teste;

        

        Viewport viewportPadrao;
        Viewport viewportMapa1;
        Viewport viewportMapa2;
        Matrix MatrizViewMapa;
        Matrix MatrizProjecaoMapa;

        Seta direita;
        Seta esquerda;
        Seta cima;
        Seta baixo;
        BotaoSair botaoSair;

        Texture2D seta_direita;
        Texture2D seta_esquerda;
        Texture2D seta_cima;
        Texture2D seta_baixo;
        Texture2D botao_sair;

        public enum TrocaSeta
        {
            Normal,
            DireitaApagada,
            EsquerdaApagada,
            CimaApagada,
            BaixoApagada,
        }
        public enum TrocaBotaoSair
        {
            Normal,
            Clicado,
        }
        TrocaSeta tipoAtual = TrocaSeta.Normal;

        TrocaBotaoSair BotaoSairAtual = TrocaBotaoSair.Normal;

        ClockTimer clock = new ClockTimer(50);

        SpriteFont font, tahoma;
        



        public Cena_Game_04(GraphicsDevice graphics, ContentManager Content)
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            
            this.graphics = graphics;

            this.font = Game1.font;
            this.tahoma = Game1.tahoma;

            luz = new Luz(graphics);

            pontos = 20;

            direita = new Seta(Content.Load<Texture2D>("setas_direita"));
            esquerda = new Seta(Content.Load<Texture2D>("setas_esquerda"));
            cima = new Seta(Content.Load<Texture2D>("setas_frente"));
            baixo = new Seta(Content.Load<Texture2D>("setas_tras"));

            seta_direita = Content.Load<Texture2D>("setas_direita");
            seta_esquerda = Content.Load<Texture2D>("setas_esquerda");
            seta_cima = Content.Load<Texture2D>("setas_frente");
            seta_baixo = Content.Load<Texture2D>("setas_tras");

            viewportPadrao = graphics.Viewport;
            viewportMapa1 = new Viewport(0, 0, 80, 60);
            viewportMapa2 = new Viewport(600, 0, 80, 60);

            MatrizViewMapa = Matrix.CreateLookAt(new Vector3(0, 200, 0), Vector3.Zero, new Vector3(0, 0, -1));
            //MatrizProjecaoMapa = Matrix.CreateOrthographic(80, 60, .1f, 300);
            MatrizProjecaoMapa = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), 4f / 3f, 1f, 200f);
            teste = Content.Load<Texture2D>("teste");

            camera = new Camera();
            cameraMapa = new Camera();
            cameraMapa.MatrizVisualizacao = MatrizViewMapa;
            cameraMapa.MatrizProjecao = MatrizProjecaoMapa;

            chao = new ObjetoJogo();
            chao.Modelo = Content.Load<Model>("chao");
            chao.Posicao += new Vector3(0.0f, -0.5f, 0.0f);
            chao.VerseChao = true;

            /*jogador = new Jogador(Content, "jogador");
            jogador.Escala = 0.1f;

            for (int i = 0; i < BoostVelocidade.QTDTotal; i++)
            {
                BoostVelocidade e = new BoostVelocidade(Content, "boostVelocidade");
                e.Escala = 0.05f;
                e.Posicao += new Vector3(random.Next(-90, 90), 0.0f, random.Next(-90, 90));
            }

            for (int i = 0; i < Barreira.QTDTotal; i++)
            {
                Barreira a = new Barreira(Content, "cilindro");
                a.Escala = 0.1f;
                a.Posicao += new Vector3(random.Next(-90, 90), 0.0f, random.Next(-90, 90));
            }

            for (int i = 0; i < Barreira.QTDTotal; i++)
            {
                Barreira b = new Barreira(Content, "cubo");
                b.Escala = 0.1f;
                b.Posicao += new Vector3(random.Next(-90, 90), 0.0f, random.Next(-90, 90));
            }

            for (int i = 0; i < Barreira.QTDTotal; i++)
            {
                Barreira c = new Barreira(Content, "piramide");
                c.Escala = 0.1f;
                c.Posicao += new Vector3(random.Next(-90, 90), 0.0f, random.Next(-90, 90));
            }*/

           
        }


        public void Update(GameTime gameTime, KeyboardState teclado_atual, KeyboardState teclado_anterior, MouseState mouse_atual, MouseState mouse_anterior)
        {
            clock.Update(gameTime);

            foreach (ObjetoJogo o in ObjetoJogo.listaObjetos)
            {
                o.CaixaColisao = ObjetoJogo.UpdateBoundingBox(o.Modelo, o.World);
            }

            jogador.Update(gameTime, teclado_atual, teclado_anterior, mouse_atual, mouse_anterior);

            camera.Update(jogador.DirecaoFrontal, jogador.Posicao);


            if (mouse_atual.LeftButton == ButtonState.Pressed)
            {
                if (new Rectangle(450, 350, 60, 60).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    tipoAtual = TrocaSeta.DireitaApagada;
                }

                if (new Rectangle(290, 350, 60, 60).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    tipoAtual = TrocaSeta.EsquerdaApagada;
                }

                if (new Rectangle(370, 300, 60, 60).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    tipoAtual = TrocaSeta.CimaApagada;
                }

                if (new Rectangle(370, 400, 60, 60).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    tipoAtual = TrocaSeta.BaixoApagada;
                }
                if (mouse_atual.LeftButton == ButtonState.Released)
                
                //faz voltar ao menu
                if (new Rectangle(600, 60, 60, 60).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    Game1.reiniciar = true;
                }
                

            }
            else
            {
                tipoAtual = TrocaSeta.Normal;
            }
            //BOTAO SAIR
            if (mouse_atual.LeftButton == ButtonState.Pressed)
            {
                if (new Rectangle(750, 430, 45, 45).Contains(mouse_atual.X, mouse_atual.Y))
                {
                    BotaoSairAtual = TrocaBotaoSair.Clicado;
                    Game1.sair = true;
                }
            }
            else
            {
                BotaoSairAtual = TrocaBotaoSair.Normal;
            }



        }

        public void Draw(GameTime gametime, SpriteBatch spriteBatch)
        {

            graphics.Viewport = viewportPadrao;
            
            foreach (ObjetoJogo objetoJogo in ObjetoJogo.listaObjetos)
            {
                objetoJogo.Desenhar(camera, luz, graphics);
            }

            //spriteBatch.Begin(
                //SpriteSortMode.Deferred,
                //BlendState.AlphaBlend, 
                //SamplerState.LinearWrap,
                //DepthStencilState.Default,
                //RasterizerState.CullNone);

            spriteBatch.Draw(teste, new Vector2(400, 0), Color.White);

                    spriteBatch.DrawString(font, "Tempo:"+clock.displayClock, new Vector2(375, 20), Color.Red);
                    spriteBatch.DrawString(font, "Energia:" + jogador.energia, new Vector2(375, 60), Color.Red);
                    spriteBatch.DrawString(font, " Fase 4 ", new Vector2(0, 350), Color.Red);
                    switch (tipoAtual)
                    {
                        case TrocaSeta.Normal:
                            spriteBatch.Draw(seta_direita, new Rectangle(450, 350, 60, 60), new Rectangle(60, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_esquerda, new Rectangle(290, 350, 60, 60), new Rectangle(260, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_cima, new Rectangle(370, 300, 60, 60), new Rectangle(0, 200, 288, 200), Color.White);
                            spriteBatch.Draw(seta_baixo, new Rectangle(370, 400, 60, 60), new Rectangle(0, 0, 250, 200), Color.White);
                            break;
                        case TrocaSeta.DireitaApagada:
                            spriteBatch.Draw(seta_direita, new Rectangle(450, 350, 60, 60), new Rectangle(345, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_esquerda, new Rectangle(290, 350, 60, 60), new Rectangle(260, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_cima, new Rectangle(370, 300, 60, 60), new Rectangle(0, 200, 288, 200), Color.White);
                            spriteBatch.Draw(seta_baixo, new Rectangle(370, 400, 60, 60), new Rectangle(0, 0, 250, 200), Color.White);
                            break;
                        case TrocaSeta.EsquerdaApagada:
                            spriteBatch.Draw(seta_direita, new Rectangle(450, 350, 60, 60), new Rectangle(60, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_esquerda, new Rectangle(290, 350, 60, 60), new Rectangle(60, 40, 200, 240), Color.White);
                            spriteBatch.Draw(seta_cima, new Rectangle(370, 300, 60, 60), new Rectangle(0, 200, 288, 200), Color.White);
                            spriteBatch.Draw(seta_baixo, new Rectangle(370, 400, 60, 60), new Rectangle(0, 0, 250, 200), Color.White);
                            break;
                        case TrocaSeta.CimaApagada:
                            spriteBatch.Draw(seta_direita, new Rectangle(450, 350, 60, 60), new Rectangle(60, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_esquerda, new Rectangle(290, 350, 60, 60), new Rectangle(260, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_cima, new Rectangle(370, 300, 60, 60), new Rectangle(0, 0, 288, 200), Color.White);
                            spriteBatch.Draw(seta_baixo, new Rectangle(370, 400, 60, 60), new Rectangle(0, 0, 250, 200), Color.White);
                            break;
                        case TrocaSeta.BaixoApagada:
                            spriteBatch.Draw(seta_direita, new Rectangle(450, 350, 60, 60), new Rectangle(60, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_esquerda, new Rectangle(290, 350, 60, 60), new Rectangle(260, 40, 285, 240), Color.White);
                            spriteBatch.Draw(seta_cima, new Rectangle(370, 300, 60, 60), new Rectangle(0, 200, 288, 200), Color.White);
                            spriteBatch.Draw(seta_baixo, new Rectangle(370, 400, 60, 60), new Rectangle(0, 220, 250, 205), Color.White);
                            break;
                    }
                    switch (BotaoSairAtual)
                    {
                        case TrocaBotaoSair.Normal:
                            spriteBatch.Draw(botao_sair, new Rectangle(750, 430, 45, 45), new Rectangle(0, 0, 42, 42), Color.White);
                            break;
                        case TrocaBotaoSair.Clicado:
                            spriteBatch.Draw(botao_sair, new Rectangle(750, 430, 45, 45), new Rectangle(48, 0, 42, 42), Color.White);
                            break;
                    }


                    spriteBatch.DrawString(tahoma, "clique", new Vector2(375, 355), Color.Red);
                    //spriteBatch.End();

                    graphics.Viewport = viewportMapa1;

                    foreach (ObjetoJogo objetoJogo in ObjetoJogo.listaObjetos)
                    {
                        objetoJogo.Desenhar(camera, luz, graphics);
                    }

                    graphics.Viewport = viewportMapa2;

                    foreach (ObjetoJogo objetoJogo in ObjetoJogo.listaObjetos)
                    {
                        objetoJogo.Desenhar(cameraMapa, luz, graphics);
                    }

                    graphics.Viewport = viewportPadrao;

        }

    }
}
